package com.example.prueba1clinicacliente;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Iterator;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;
import org.xmlpull.v1.XmlPullParserException;

import com.example.prueba1clinicacliente.VerPrestaciones.ObtenerPrestacionesBackground;

import android.app.Activity;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.Toast;

/**
 * Esta clase permite visualizar en una lista y por medio de parametros de busqueda, los pacientes existentes 
 * en la base de datos.
 * @author Renew21
 *
 */
public class BuscarPacientes extends ListActivity{
	
	//Se declaran los atributos.
	private String URL = Constantes.HOST + "/Prueba1ClinicaSoap/services/ClinicaWebService";
	private String NAMESPACE = "http://com.webservice.orm";	
	private ArrayList<Paciente> pacientes;
	private ArrayList<Prestacion> prestaciones;
	private ArrayList<String> opcPrestaciones;
	private Spinner opcPrestacionesSpinner;
	
	private Button fechaDesde;
	private Button fechaHasta;
	
	private int mYear;    
    private int mMonth;    
    private int mDay;
    
    private Validaciones v = new Validaciones();
    
    //Este indicador me permitira identificar a cual de los 2 botones (desde-hasta) se le hizo clic en el layout.
    private int indicador = 0;
    
    static final int DATE_DIALOG_ID = 0;
    
    //Se declara un objeto DatePicker que contiene el calendario que visualizara el usuario.
    private DatePickerDialog.OnDateSetListener mDateSetListener =            
        	new DatePickerDialog.OnDateSetListener() {                
        	public void onDateSet(DatePicker view, int year,                                       
        			int monthOfYear, int dayOfMonth) {
        		//Aqui se inicia con la fecha actual en cada texto de ambos botones (desde-hasta).
        		if(indicador == 1){
        				mYear = year;                    
        				mMonth = monthOfYear;                    
        				mDay = dayOfMonth;                    
        				updateDisplay();
        		}else if(indicador == 2){
        				mYear = year;                    
        				mMonth = monthOfYear;                    
        				mDay = dayOfMonth;                    
        				updateDisplay();
        		}else{
        			indicador = 0;
        		}
        	}
        	};
        	
        	/**
        	 * Este metodo sobreescribe el texto de cada boton, dependiendo de cual fue clickeado; con la fecha que se escogio en el DatePicker.
        	 * Se valida ademas que desde no sea posterior a hasta o que cada fecha no sobrepase la fecha actual.
        	 */
        	private void updateDisplay() {
        	
        		if(indicador == 1){
        			fechaDesde.setText(            
                			new StringBuilder()                    
                			// El mes parte de 0 por lo que se le suma 1.                    
                			.append(mMonth + 1).append("-")                    
                			.append(mDay).append("-")                    
                			.append(mYear).append(" "));
        			
        			if(v.validarFechaDesdeHasta(fechaDesde.getText().toString(), fechaHasta.getText().toString())== false){
        				fechaDesde.setText(fechaHasta.getText().toString());
        				Toast.makeText(BuscarPacientes.this, "Fecha invalida, asegurese que la fecha 'Desde' no sea posterior a la fecha 'Hasta' o que ambas no " +
        						"sobrepasen la fecha de hoy.", Toast.LENGTH_LONG).show();
        			}else{
        			}
        		
        		}else if(indicador == 2){
        			fechaHasta.setText(            
                			new StringBuilder()                    
                			// El mes parte de 0 por lo que se le suma 1.                    
                			.append(mMonth + 1).append("-")                    
                			.append(mDay).append("-")                    
                			.append(mYear).append(" "));
        			
        			if(v.validarFechaDesdeHasta(fechaDesde.getText().toString(), fechaHasta.getText().toString())== false){
        				fechaHasta.setText(fechaDesde.getText().toString());
        				Toast.makeText(BuscarPacientes.this, "Fecha invalida, asegurese que la fecha 'Desde' no sea posterior a la fecha 'Hasta' o que ambas no " +
        						"sobrepasen la fecha de hoy.", Toast.LENGTH_LONG).show();
        			}else{
        			}
        			
        		}else if(indicador == 0){
        			fechaDesde.setText(            
                			new StringBuilder()                    
                			// El mes parte de 0 por lo que se le suma 1.                   
                			.append(mMonth + 1).append("-")                    
                			.append(mDay).append("-")                    
                			.append(mYear).append(" "));
        			
        			fechaHasta.setText(            
                			new StringBuilder()                    
                			// El mes parte de 0 por lo que se le suma 1.                    
                			.append(mMonth + 1).append("-")                    
                			.append(mDay).append("-")                    
                			.append(mYear).append(" "));
        		}
        		
            }
        	@Override
            protected Dialog onCreateDialog(int id) {    
            	switch (id) {   
            		case DATE_DIALOG_ID:
            			return new DatePickerDialog(this,                    
            					mDateSetListener,                    
            					mYear, mMonth, mDay); 
            			
    					}
            	return null;
            	}
        	
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.buscar_pacientes);
		
		//Se inicializan los atributos.
		opcPrestacionesSpinner = (Spinner) findViewById(R.id.spn_opcprestaciones);
		fechaDesde = (Button) findViewById(R.id.btn_fecha1pac);
		fechaHasta = (Button) findViewById(R.id.btn_fecha2pac);
		pacientes = new ArrayList<Paciente>();
		prestaciones = new ArrayList<Prestacion>();
		opcPrestaciones = new ArrayList<String>();
		
		// obteniene la fecha actual        
    	final Calendar c = Calendar.getInstance();        
    	mYear = c.get(Calendar.YEAR);        
    	mMonth = c.get(Calendar.MONTH);        
    	mDay = c.get(Calendar.DAY_OF_MONTH);        
    	  
    	//Toast.makeText(this, "indicador es "+indicador, Toast.LENGTH_SHORT).show();
    	// metodo que actualiza el texto del boton 
    	updateDisplay();
    	
		new ObtenerOpcPrestacionesBackground().execute();
	}

	/**
	 * Metodo que permite vizualizar el calendario en el layout para que el usuario pueda ingresar una fecha.
	 * @param v Recibe el evento clic del usuario en el boton.
	 */
	public void ingresarFechaDesde(View v){
		
		indicador = 1;
		showDialog(DATE_DIALOG_ID);
	}
	
	/**
	 * Metodo que permite vizualizar el calendario en el layout para que el usuario pueda ingresar una fecha.
	 * @param v Recibe el evento clic del usuario en el boton.
	 */
	public void ingresarFechaHasta(View v){
		
		indicador = 2;
		showDialog(DATE_DIALOG_ID); 
	}
	
	public void buscarPaciente(View v){
		
		new ObtenerPacientesPrestacionesBackground().execute();
	}
	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		
			//Intent intent = new Intent(BuscarPacientes.this, ActualizarPaciente.class);
			//intent.putExtra("paciente", );
			//startActivity(intent);
		
	}
	
	/**
	 * Se obtiene una lista con las diferentes opciones de prestaciones existentes en la base de datos por medio del web service.
	 * @author Renew21
	 *
	 */
	class ObtenerOpcPrestacionesBackground extends AsyncTask<Void, Void, String>{
		
		private ProgressDialog progressDialog;

		@Override
		protected void onPreExecute() {
    		progressDialog = ProgressDialog.show(
    				BuscarPacientes.this,
    				"OpcPrestaciones", 
    				"Espere mientras se carga el sistema...", 
    				true);
			super.onPreExecute();
		}
		
		@Override
		protected String doInBackground(Void... params) {

			String opcPrestacionesJSON="";
			String METHOD_NAME = "obtenerOpcionPrestaciones";
			String SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes =true;
			soapEnvelope.setOutputSoapObject(request);

			HttpTransportSE aht = new HttpTransportSE(URL);

			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				opcPrestacionesJSON = resultString.toString();

			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}

			return opcPrestacionesJSON;
		}

		@Override
		protected void onPostExecute(String result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			//Valido que tenga la informacion necesaria
			if("".equals(result)){
				Toast.makeText(BuscarPacientes.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
			}else{
				try {
					ArrayList<String> prestacionesList = new ArrayList<String>();
					String texto = "";
					Log.d("", result);
					JSONObject resultado = new JSONObject(result);
					resultado.names();
					resultado.keys();
					for (Iterator iterator = resultado.keys(); iterator.hasNext();) {
						String string = (String) iterator.next();
						opcPrestaciones.add(string);
						prestacionesList.add(resultado.getString(string));
						
					}
					
					ArrayAdapter<String> generosAdapter = new ArrayAdapter<String>(BuscarPacientes.this, android.R.layout.simple_spinner_item, prestacionesList);
					opcPrestacionesSpinner.setAdapter(generosAdapter);
					
				} catch (JSONException e) {
					Toast.makeText(BuscarPacientes.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
				}
			}
		}
	}
	
	/**
	 * Esta clase permite obtener los datos de los pacientes y prestaciones existentes en la base de datos por medio
	 * de la conexion al web service.
	 * @author Renew21
	 *
	 */
	class ObtenerPacientesPrestacionesBackground extends AsyncTask<Void, Void, HashMap<String, String>>{
    	
    	private ProgressDialog progressDialog;
    	
    	
		@Override
		protected void onPreExecute() {
    		progressDialog = ProgressDialog.show(
    				BuscarPacientes.this,
    				"Pacientes", 
    				"Espere mientras se carga la lista de pacientes...", 
    				true);
			super.onPreExecute();
		}

		@Override
		protected HashMap<String, String> doInBackground(Void... params) {

			
			//Se accede al metodo obtenerPrestaciones para obtener los datos que se necesitan.
			HashMap<String, String> resultado = new HashMap<String, String>();
			String prestacionesJSON="";
	    	String METHOD_NAME = "obtenerPrestaciones";
	    	String SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
			SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes =true;
			soapEnvelope.setOutputSoapObject(request);

			HttpTransportSE aht = new HttpTransportSE(URL);
			Log.d("Cliente SOAP", "Iniciando Consulta");
			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				prestacionesJSON = resultString.toString();
				resultado.put("prestaciones", prestacionesJSON);
				Log.d("Cliente SOAP", "Finalizando Consulta");
				
				
				
			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}
			
			//De igual manera se accede al metodo obtenerPacientes.
			String pacientesJSON="";
	    	METHOD_NAME = "obtenerPacientes";
	    	SOAP_ACTION = NAMESPACE +"/" +METHOD_NAME;
			request = new SoapObject(NAMESPACE, METHOD_NAME);
			soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
			soapEnvelope.dotNet = true;
			soapEnvelope.implicitTypes =true;
			soapEnvelope.setOutputSoapObject(request);

			aht = new HttpTransportSE(URL);
			Log.d("Cliente SOAP", "Iniciando Consulta");
			try {
				aht.call(SOAP_ACTION, soapEnvelope);
				SoapPrimitive resultString = (SoapPrimitive)soapEnvelope.getResponse();
				pacientesJSON = resultString.toString();
				resultado.put("pacientes", pacientesJSON);
				Log.d("Cliente SOAP", "Finalizando Consulta");
				
				
				
			} catch (IOException e) {
				e.printStackTrace();
			} catch (XmlPullParserException e) {
				e.printStackTrace();
			}
			
			return resultado;
	    
		}

		@Override
		protected void onPostExecute(HashMap<String, String> result) {
			super.onPostExecute(result);
			progressDialog.dismiss();
			ArrayList<String> prestacionesList = new ArrayList<String>();
			
			//Se verifica que los datos esten efectivamente disponibles.
			if(result.containsKey("prestaciones") && !"".equals(result.get("prestaciones"))){
				try {
					
					prestaciones = new ArrayList<Prestacion>();
					String texto = "";
					Log.d("", result.get("prestaciones"));
					JSONObject resultado = new JSONObject(result.get("prestaciones"));
					String contenido = resultado.getString("Contenido");
					Log.d("ClienteSoap", contenido);
					JSONArray prestacionesJSONArray = new JSONArray(contenido);
					int opcion;
					Validaciones val = new Validaciones();
					opcion = Integer.parseInt(opcPrestaciones.get(opcPrestacionesSpinner.getSelectedItemPosition()));
					
					int cantPrestaciones = prestacionesJSONArray.length();
					for(int i = 0; i< cantPrestaciones; i ++){
						Prestacion prestacion = new Prestacion();
						
						//Se valida que la opcion de prestacion escogida por el usuario final sea un creterio de busqueda.
						if(prestacionesJSONArray.getJSONObject(i).getInt("IdOpcion") == opcion){
							
							//Se valida la fecha de la prestacion en caso de encontrar alguna coincidencia de paciente con una prestacion determinada.
							if(val.filtroFecha(prestacionesJSONArray.getJSONObject(i).getString("Fecha"),fechaDesde.getText().toString() , fechaHasta.getText().toString()) 
									!= false){
							
								//Se recolectan los datos con los criterios de busqueda correspondientes.
								texto += prestacionesJSONArray.getJSONObject(i).getInt("IdPrestacion") +"\n";
								prestacion.setIdPrestacion(prestacionesJSONArray.getJSONObject(i).getInt("IdPrestacion")+"");
								texto += prestacionesJSONArray.getJSONObject(i).getString("Diagnostico") +"\n";
								prestacion.setDiagnostico(prestacionesJSONArray.getJSONObject(i).getString("Diagnostico"));
								texto += prestacionesJSONArray.getJSONObject(i).getString("Fecha") +"\n";
								prestacion.setFecha(prestacionesJSONArray.getJSONObject(i).getString("Fecha"));
								texto += prestacionesJSONArray.getJSONObject(i).getString("PacienteRut") +"\n";
								prestacion.setRutPaciente(prestacionesJSONArray.getJSONObject(i).getString("PacienteRut"));
								texto += prestacionesJSONArray.getJSONObject(i).getInt("IdOpcion") +"\n";
								prestacion.setIdOpcion(prestacionesJSONArray.getJSONObject(i).getInt("IdOpcion")+"");
								texto += "\n";
							
								//Se agrega el dato encontrado a una lista para emitirlo al usuario.
								prestacionesList.add(prestacionesJSONArray.getJSONObject(i).getString("PacienteRut"));
							}
						}else{
							
						}
					}
					// Se incorpora la lista creada anteriormente al adaptador de lista.
					ArrayAdapter<String> pacientesAdapter = new ArrayAdapter<String>(BuscarPacientes.this, android.R.layout.simple_list_item_1,prestacionesList);
					setListAdapter(pacientesAdapter);
					
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}


			}else{
				Toast.makeText(BuscarPacientes.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
			}
			
			//Valido que tenga la informacion necesaria
			if(result.containsKey("pacientes") && !"".equals(result.get("pacientes"))){
				try {
					
					pacientes = new ArrayList<Paciente>();
					String texto = "";
					Log.d("", result.get("pacientes"));
					JSONObject resultado = new JSONObject(result.get("pacientes"));
					String contenido = resultado.getString("Contenido");
					JSONArray pacientesJSONArray = new JSONArray(contenido);
					
					int cantPacientes = pacientesJSONArray.length();
					for(int i = 0; i< cantPacientes; i ++){
						
						
						/*if(pacientesJSONArray.getJSONObject(i).getString("Rut").toString().equals(prestacionesList.get(index)){
							Paciente paciente = new Paciente();
							texto += pacientesJSONArray.getJSONObject(i).getString("Rut") +"\n";
							paciente.setRut(pacientesJSONArray.getJSONObject(i).getString("Rut"));
							texto += pacientesJSONArray.getJSONObject(i).getString("Nombre") +"\n";
							paciente.setNombre(pacientesJSONArray.getJSONObject(i).getString("Nombre"));
							texto += pacientesJSONArray.getJSONObject(i).getString("Direccion") +"\n";
							paciente.setDireccion(pacientesJSONArray.getJSONObject(i).getString("Direccion"));
							texto += "\n";
							pacientes.add(paciente);
							prestacionesList.add(pacientesJSONArray.getJSONObject(i).getString("Rut").toString());
						}*/
					}
					
					//ArrayAdapter<String> pacientesAdapter = new ArrayAdapter<String>(BuscarPacientes.this, android.R.layout.simple_list_item_1,prestacionesList);
					//setListAdapter(pacientesAdapter);
					
				} catch (JSONException e) {
					Toast.makeText(BuscarPacientes.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
				}
				
				
			}else{
				Toast.makeText(BuscarPacientes.this, "Error al obtener la informacion necesaria", Toast.LENGTH_LONG).show();
			}
		}
    }
}
